
# 导入requests包
import requests
# 1.组装请求： 请求可能包含url，params(url参数)，data(请求数据)，headers(请求头)，cookies等，最少必须有url
url = 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister'
params = {'LoginAccount': 'testapi@emai.com', 'Password': '123456', 'Type': 'Pro'}   # 把参数封装成字典
# 2.发送请求，获取响应：支持get，post等各种方法发送，返回的是一个响应对象
res = requests.post(url,params)
# 3.解析响应：输出响应文本等等
print(res.text)  # 输出响应的文本
print(res.status_code)  # 状态码
print(res.headers)  # 响应头
print(res.json())  # 返回的是字典

#封装http接口请求🎃
# 导入requests包
import requests
class HttpRequest:
    def http_request(self, url, params, http_method):
        res = ''
        if http_method.upper()=='POST':
            try:
                res=requests.post(url,params)
                print("正在进行post请求")
            except Exception as e:
                print("post请求出现了异常：{0}".format(e))
        elif http_method.upper()=='GET':
            try:
                res=requests.post(url,params)
                print("正在进行get请求")
            except Exception as e:
                print("get请求出现了异常：{0}".format(e))
        return res
if __name__ == '__main__':
    url = 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister'
    datas = {'LoginAccount': 'testapi01@emai.com', 'Password': '123456', 'Type': 'Pro'}
    res=HttpRequest().http_request(url, datas, 'post')
    print(res.json())

#TestCase调用封装好的http请求，并添加异常处理。😡
# 导入
import unittest
import requests
from Common.http_request import HttpRequest
class TestRegister (unittest.TestCase):   # 类必须以Test开头，继承TestCase
    url = 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister'
    def setUp(self):
        print("======开始执行测试用例======")
    def tearDown(self):
        print("======测试用例执行完毕======")
    # 测试用例 - 正常注册
    def test_register_normal(self):  # 每一条测试用例以test_开头
        # 发送请求
        params = {'LoginAccount': 'apitest09@emai.com', 'Password': '123456', 'Type': 'Pro'}
        # res = requests.post(self.url,params)
        res = HttpRequest().http_request(self.url,params,'post')
        # 断言：根据实际测试场景，可以查询数据库是否有新注册的用户、对比接口的返回信息、对比状态码等等
        try:
            self.assertEqual(200, res.status_code)
            print('成功测试用户:{}'.format(params['LoginAccount']))
        except AssertionError as e:
            print('Failed')
            raise e   # 注意一定要抛出异常
    # 测试用例 - 重复注册
    def test_register_existing(self):
        # 发送请求
        params = {'LoginAccount': 'apitest05@emai.com', 'Password': '123456', 'Type': 'Pro'}
        # res = requests.post(self.url,params)
        res = HttpRequest().http_request(self.url, params, 'post')
        # 断言
        try:
            self.assertIn("The email has been registered", res.json()['Message'])
            print("执行结果:pass:", res.json()['Message'])
        except AssertionError as e:
            print('执行结果:Failed')
            raise e
    # 测试用例 - 无效的邮箱格式去注册
    def test_register_invalid_email(self):
        # 发送请求
        params = {'LoginAccount': 'testapi@emai', 'Password': '123456', 'Type': 'Pro'}
        # res = requests.post(self.url,params)
        res = HttpRequest().http_request(self.url, params, 'post')
        # 断言
        try:
            self.assertIn("valid email", res.json()['Message'])
            print("执行结果:pass:", res.json()['Message'])
        except AssertionError as e:
            print('执行结果:Failed')
            raise e

#unittest测试用例😈
# 导入
import unittest
import requests
class TestRegister(unittest.TestCase):  # 类必须以Test开头，继承TestCase

    def setUp(self):
        print("======开始执行测试用例======")
        self.url = 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister'
    def tearDown(self):
        print("======测试用例执行完毕======")
    # 测试用例 - 正常注册
    def test_register_normal(self):  # 每一条测试用例以test_开头
        # 发送请求
        params = {'LoginAccount': 'apitest08@emai.com', 'Password': '123456', 'Type': 'Pro'}
        res = requests.post(self.url,params)
        # 断言：根据实际测试场景，可以查询数据库是否有新注册的用户、对比接口的返回信息、对比状态码等等
        self.assertEqual(200, res.status_code)
    # 测试用例 - 重复注册
    def test_register_existing(self):
        # 发送请求
        params = {'LoginAccount': 'apitest05@emai.com', 'Password': '123456', 'Type': 'Pro'}
        res = requests.post(self.url,params)
        # 断言
        print("执行结果:", res.json()['Message'])
        self.assertIn("The email has been registered", res.json()['Message'])

    # 测试用例 - 无效的邮箱格式去注册
    def test_register_invalid_email(self):
        # 发送请求
        params = {'LoginAccount': 'testapi@emai', 'Password': '123456', 'Type': 'Pro'}
        res = requests.post(self.url,params)
        # 断言
        print("执行结果:", res.json()['Message'])
        self.assertIn("valid email", res.json()['Message'])
if __name__ == '__main__':  # 从当前模块执行
    unittest.main()

#生成报告👄
import unittest
import HTMLTestRunnerNew  # 导入用于生成测试报告
from Common import project_path  # 读取文件路径
from Common.test_register import TestRegister  # 导入测试类
suite=unittest.TestSuite()
# 1. 加载测试用例：把测试用例放到测试套件suite里面
suite.addTest(TestRegister('test_register_normal'))
suite.addTest(TestRegister('test_register_existing'))
suite.addTest(TestRegister('test_register_invalid_email'))
# 2.运行测试集, 并生成Html测试报告
with open(project_path.report_path,'wb') as file:
    runner=HTMLTestRunnerNew.HTMLTestRunner(
        stream=file, verbosity=2,
        title='ServiceX API Testing',
        description='ServiceX API Testing',
        tester='Jiali')
    runner.run(suite)

# 封装读取测试数据excel操作🥵
from xlrd import open_workbook
class Doexcel():
    def excel_data_list(self, filename, sheetname):
        data_list = []
        wb = open_workbook(filename)  # 打开excel
        sh = wb.sheet_by_name(sheetname)  # 定位工作表
        header = sh.row_values(0)   # 获取标题行的数据
        for i in range(1, sh.nrows):   # 跳过标题行，从第二行开始获取数据
            col_datas = dict(zip(sh.row_values(0), sh.row_values(i)))   # 将标题和每一行的数据，组装成字典
            data_list.append(col_datas)   # 将字典添加到列表中 ，列表嵌套字典，相当于每个字典的元素都是一个列表（也就是一行数据）
        return data_list
    def get_test_data(self, data_list, case_id):
        '''
        param data_list: 工作表的所有行数据
        param case_id: 用例id，用来判断执行哪几条case。如果id=all ，那就执行所有用例；否则，执行列表参数中指定的用例
        return:  返回最终要执行的测试用例
        '''
        if case_id == 'all':    
            final_data = data_list
        else:
            final_data = []
            for item in data_list:
                if item['id'] in case_id:
                    final_data.append(item)
        return final_data
if __name__ == '__main__':    
    data_list=Doexcel().excel_data_list('F:\JialiProgramfile\serviceX_API_Test\Test_datas\TestData.xlsx','register')   
    final_data=Doexcel().get_test_data(data_list, [1,2,3])    
    print(final_data)

#数据驱动，测试数据的参数化👽
# 导入
import unittest
import requests
from Common.http_request import HttpRequest
from ddt import ddt,data   # 引入ddt模块
from Common.do_excel import *
test_data = Doexcel().excel_data_list('F:\JialiProgramfile\serviceX_API_Test\Test_datas\TestData.xlsx','register')   
#读取工作表 register 的所有数据 ,返回的是个列表嵌套字典格式
@ddt
class TestRegister (unittest.TestCase):   # 类必须以Test开头，继承TestCase
    def setUp(self):
        print("======开始执行测试用例======")
    def tearDown(self):
        print("======测试用例执行完毕======")
    # 测试用例
    @data(*test_data)   
    def test_register(self, data_itme):  # data_item 就是每一组测试数据（字典的形式）
        # 发送请求
        res = HttpRequest().http_request(data_itme['url'],eval(data_itme['params']),data_itme['method'])
        # 断言：
        try:
            self.assertEqual(int(data_itme['expect_res']), res.status_code)
        except AssertionError as e:
            print('Failed')
            raise e   # 注意一定要抛出异常

#测试结果写回❤️‍
def write_back_result(self, filename, sheetname, row, actual_res, test_result):
        '''      
         filename: 文件名
         sheetname: 要写回数据的表格
         row: 要写回的行数
         actual_res: 实际结果 ：实际结果是第8列，测试结果是第9列 ，比如：（2，8）（2，9）
         test_result: 测试结果 ：pass/failed
         return: 
        '''
        wb = load_workbook(filename)
        sheet = wb[sheetname]
        sheet.cell(row,8).value = actual_res    
        sheet.cell(row,9).value = test_result 
        wb.save(filename)